package com.java.simple.study.jvm.gc.reference;

import java.lang.ref.WeakReference;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * @author zhoujunlin
 * @date 2022年11月08日 11:04
 * @desc
 */
public class WeakReferenceTest {

    @Getter
    @Setter
    @ToString
    @AllArgsConstructor
    public static class User {
        private int id;
        private String name;
    }

    public static void main(String[] args) {
        // 创建对象并建立弱引用
        // WeakReference<User> userSoftReference = new WeakReference<>(new User(1, "zhoujl"));
        // 上面的一行代码等价于下面代码
        User user = new User(1, "zhoujl");
        WeakReference<User> userWeakReference = new WeakReference<>(user);
        // 取消强引用  只剩下一个弱引用
        user = null;

        // 从弱引用中重新获得对象
        System.out.println(userWeakReference.get());
        System.gc();
        System.out.println("After GC");
        // 垃圾回收过后再次从弱引用中获取对象 不管内存是否充足  都会回收弱引用
        System.out.println(userWeakReference.get());
    }

}
